﻿#include "AllInc.h"
/*
给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，
并且它们的每个节点只能存储 一位 数字。
如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

示例：

输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出：7 -> 0 -> 8
原因：342 + 465 = 807
*/
struct ListNode 
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
 
class Solution {
public:
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
	{
		ListNode result(0);
		ListNode* cur = &result;
		unsigned char c = 0;
		while (l1 || l2)
		{
			if (l1 && l2)
			{
				unsigned char s = l1->val + l2->val + c;
				c = s / 10;

				l1 = l1->next;
				l2 = l2->next;

				ListNode* node = new ListNode(s % 10);
				cur->next= node;
				cur = node;
			}
			else if (l1)
			{
				while (l1)
				{
					unsigned char s = l1->val + c;
					c = s / 10;
					l1 = l1->next;
					ListNode* node = new ListNode(s % 10);
					cur->next = node;
					cur = node;
				}			}
			else if (l2)
			{
				while (l2)
				{
					unsigned char s = l2->val + c;
					c = s / 10;
					l2 = l2->next;
					ListNode* node = new ListNode(s % 10);
					cur->next = node;
					cur = node;
				}
			}
		}
		if (c)
		{
			ListNode* node = new ListNode(c);
			cur->next = node;
			cur = node;
		}

		return result.next;
	}
};

//int main()
//{
//	Solution s;
//
//	ListNode n1(0);
//	//ListNode n2(4);
//	//ListNode n3(2);
//	ListNode n4(7);
//	ListNode n5(3);
//	//ListNode n6(5);
//	//n1.next = &n2;
//	//n2.next = &n3;
//	n4.next = &n5;
//	//n5.next = &n6;
//
//	ListNode* result = s.addTwoNumbers(&n1, &n4);
//	
//	return 0;
//}